/**
 * 作者：Carlus
 * 链接：https://juejin.cn/post/6844903625769091079
 * 学习如何手写一个Promise类
*/
export default class Promise {
  //传入的是一个函数，这里的executor是一个函数，因为平时的写法
  /**
   * 平时使用Promise的写法
   * let promise = new Promise((resolve,reject)=>{});
   */
  constructor(executor) {
    /**
     * 解释：
     * 1、 state 是Promise的状态，分别有 pending fulfilled rejected，还没处理，初始状态为 pending
     * 2、 value是传进来的值，成功的时候，成功接受的参数
     * 3、 reason 是失败传进来的参数
     */
    this.state = "pending";
    this.value = undefined;
    this.reason = undefined;
    // 如果是成功
    let resolve = (value) => {
      if (this.state == "pending") {
        this.state = "fulfilled";
        this.value = value;
      }
    }
    // 如果是失败
    let reject = (reason) => {
      if (this.state === 'pending') {
        this.state = 'rejected'; 
        this.reason = reason;
      }
    }
    /**
     * 我的理解是
     * 在截取使用该Promise的用户，throws出错误的时候，我们捕获
     * 把throws的情况当作reject(错误)的情况去处理
     */
    try {
      executor(resolve, reject);
    } catch (err) {
      reject(err);
    }
  }
  // 定义.then方法
  then(onFulfilled, onRejected) {
    // 状态为fulfilled，执行onFulfilled，传入成功的值
    if (this.state === 'fulfilled') {
      onFulfilled(this.value);
    };
    // 状态为rejected，执行onRejected，传入失败的原因
    if (this.state === 'rejected') {
      onRejected(this.reason);
    };
  }
}